//
//  HMStatusViewModel.swift
//  HMVVeibo23
//
//  Created by apple on 17/2/4.
//  Copyright © 2017年 apple. All rights reserved.
//

import UIKit
import YYText
/*
    - view 级别的ViewModel
        - 对HomeModel的数据 进行处理
 */
class HMStatusViewModel: NSObject {
    // homeModel
    var homeModel: HMHomeModel?{
        didSet{
            // 处理会员等级逻辑
            membershipImage = dealMembershipImage(mbrank: homeModel?.user?.mbrank ?? 0)
            // 处理用户认证类型
            avatarImage = dealAvatarImage(verified: homeModel?.user?.verified ?? -1)
            // 处理微博来源
            sourceStr = dealSinaSource(source: homeModel?.source)
            // 原创微博
            orignalContentAttributedString = dealContentAttributedString(text: homeModel?.text ?? "")
            // 转发微博的
            retweetContentAttributedString = dealContentAttributedString(text: homeModel?.retweeted_status?.text ?? "")
        }
    }

    // 会员等级iamge
    var membershipImage: UIImage?
    // 用户认证类型
    var avatarImage: UIImage?
    // 微博来源字符串
    var sourceStr: String?
    // 微博时间
    var sinaTimeStr: String?{
        return dealSinaTime(createAt: homeModel?.created_at)
    }
    // 原创微博的富文本
    var orignalContentAttributedString: NSMutableAttributedString?
    // 转发微博的富文本
    var retweetContentAttributedString: NSMutableAttributedString?
}

//MARK:- 处理首页的图文混排
extension HMStatusViewModel {
    // 处理首页的图文混排
    func dealContentAttributedString(text: String) -> NSMutableAttributedString{
        // 把内容字符串转成一个可变的富文本
        let allAttr = NSMutableAttributedString(string: text)
        
        // [拜拜拜拜]
        // 使用正则匹配我们想要的格式内容
        let matchResult = try! NSRegularExpression(pattern: "\\[[\\w]+\\]", options: []).matches(in: text, options: [], range: NSRange(location: 0, length: text.characters.count))
        // 倒着遍历匹配到的结果集合
        for match in matchResult.reversed() {
            let result = (text as NSString).substring(with: match.range)
            // 得到对应的模型
            let emoticonModel = HMEmoticonTools.shared.getEmoticonModelWith(chs: result)
            // 创建一个不可变的富文本
//            let attr = NSAttributedString.emoticonAttributedString(emoticonModel: emoticonModel)
            // 使用yyLable 就要使用yytext的构造方法创建可变的富文本
            let path = emoticonModel?.path
            if let p = path {
                // 获取bundle文件中图片
                let image = UIImage(named: p, in: HMEmoticonTools.shared.emoticonBundle, compatibleWith: nil)!
                let attr = NSAttributedString.yy_attachmentString(withEmojiImage: image, fontSize: HMNORMALFONTSIZE)!
                // 吧图片描述替换成不可变的富文本
                allAttr.replaceCharacters(in: match.range, with: attr)
            }
            
            
        }
        
        
        // 设置富文本的字体大小
        allAttr.addAttributes([NSFontAttributeName: UIFont.systemFont(ofSize: HMNORMALFONTSIZE)], range: NSRange(location: 0, length: allAttr.length))
        // 设置富文本高亮属性
        // 匹配用户// \u4e00-\\u9fa5汉字
        addHighLightedAttributedString(allAttr: allAttr, pattern: "@[a-zA-Z0-9\\u4e00-\\u9fa5_\\-]+")
        // 话题
        addHighLightedAttributedString(allAttr: allAttr, pattern: "#[^#]+#")
        // url
        addHighLightedAttributedString(allAttr: allAttr, pattern: "([hH]ttp[s]{0,1})://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\-~!@#$%^&*+?:_/=<>.',;]*)?")
        return allAttr
    }
    
    // 设置富文本上的高亮效果
    /*
     匹配用户：@[a-zA-Z0-9\\u4e00-\\u9fa5_\\-]+
     匹配话题：#[^#]+#
     匹配URL：([hH]ttp[s]{0,1})://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\-~!@#$%^&*+?:_/=<>.',;]*)?
     */
    func addHighLightedAttributedString(allAttr: NSMutableAttributedString, pattern: String){
        // 吧传入的可变富文本转成字符串
        let text = allAttr.string
        // 通过正则匹配结果集合
        let matchResult = try! NSRegularExpression(pattern: pattern, options: []).matches(in: text, options: [], range: NSRange(location: 0, length: text.characters.count))
        // 遍历集合
        for match in matchResult{
            // 设置富文本点击高亮后的背景颜色
            //cornerRadius 圆角
            let border = YYTextBorder(fill: UIColor.black, cornerRadius: 3)
            // she
            border.insets = UIEdgeInsetsMake(1, -2, 0, -2)
            // 创建文本高亮对象
            let highlight = YYTextHighlight()
            // 设置高亮下文字的颜色
            highlight.setColor(HMThemeColor)
            // 设置背景yanse
            highlight.setBackgroundBorder(border)
            //把"高亮"属性设置到某个文本范围
            allAttr.yy_setTextHighlight(highlight, range: match.range)
            // 匹配到结果后设置默认颜色
            allAttr.addAttributes([NSForegroundColorAttributeName: UIColor.red], range: match.range)
        }
        
        /*
         YYTextBorder *border = [YYTextBorder borderWithFillColor:[UIColor grayColor] cornerRadius:3];
         
         YYTextHighlight *highlight = [YYTextHighlight new];
         [highlight setColor:[UIColor whiteColor]];
         [highlight setBackgroundBorder:highlightBorder];
         highlight.tapAction = ^(UIView *containerView, NSAttributedString *text, NSRange range, CGRect rect) {
         NSLog(@"tap text range:...");
         // 你也可以把事件回调放到 YYLabel 和 YYTextView 来处理。
         };
         
         // 2. 把"高亮"属性设置到某个文本范围
         [attributedText yy_setTextHighlight:highlight range:highlightRange];
         */
        
    }
}

//MARK:- 处理用户相关逻辑
extension HMStatusViewModel{
    /// 会员等级 1-6
    func dealMembershipImage(mbrank: Int) -> UIImage? {
        if mbrank >= 1 && mbrank <= 6{
            return UIImage(named: "common_icon_membership_level\(mbrank)")
        }else {
            return UIImage(named: "common_icon_membership")
        }
    }
    
    /// 认证类型 -1：没有认证，1，认证用户，2,3,5: 企业认证，220: 达人
    func dealAvatarImage(verified: Int) -> UIImage? {
        switch verified {
        case 1:
            return UIImage(named: "avatar_vip")
        case 2,3,5:
            return UIImage(named: "avatar_enterprise_vip")
        case 220:
            return UIImage(named: "avatar_grassroot")
        default:
            return UIImage(named: "avatar_vgirl")
        }
    }
    
    //MARK: 处理微博来源
    /*
     Optional("<a href=\"http://app.weibo.com/t/feed/3auC5p\" rel=\"nofollow\">皮皮时光机</a>")
     
     */
    func dealSinaSource(source: String?) -> String{
        // 判断source 是否为nil 而且不包含\">
        guard let s = source, s.contains("\">") else {
            return "来自: 黑马23期"
        }
        // 获取起始光标
        let start = s.range(of: "\">")!
        // 获取结束光标
        let end = s.range(of: "</a")!
        // 得到最终的结果(范围)
        let result = s.substring(with: start.upperBound..<end.lowerBound)
        return "来自:" + result
    }
    
    //MARK: 处理微博时间
    /*
     - 业务逻辑介绍
     -如果是今年
     - 如果是今天
     - 如果当前时间和微博时间比较 赋值给s(秒数)
     如果s <= 60 显示 刚刚
     如果s > 60 && s <= 60*60 显示 x分钟前
     如果 s > 60*60 显示 x小时前
     - 如果是昨天
     - 显示的格式为 昨天 HH:mm 例如 昨天 14:14
     - 如果不是今天和昨天
     - 显示的格式为 MM-dd HH:mm 例如 02-02 02:02
     -如果不是今年
     - 显示的格式为 yyyy-MM-dd HH:mm  例如 2015-12-12 12:12
     */
    func dealSinaTime(createAt: Date?) -> String?{
        // 判断createAt 是否为nil
        guard let sinaDate = createAt else {
            return nil
        }
        // 测试数据//addingTimeInterval 加一个时间
        //        sinaDate = sinaDate.addingTimeInterval(-3600*24*2*360)
        
        // 时间格式化
        let df = DateFormatter()
        // 计算是否是今年
        let isThisYear = sinaDateisThisYear(sinaDate: sinaDate)
        // 是今年
        if isThisYear {
            // 日历类
            let calendar = Calendar.current
            // 今天
            if calendar.isDateInToday(sinaDate) {
                // 计算出当前日期和微博日期的秒数差值 abs 绝对值
                let s = abs(sinaDate.timeIntervalSinceNow)
                // 刚刚
                if s <= 60 {
                    return "刚刚"
                }else if s > 60 && s <= 60*60 {
                    // X分钟前
                    return "\(Int(s/60))分钟前"
                }else {
                    // X小时前
                    return "\(Int(s/(60*60)))小时前"
                }
                
            }else if calendar.isDateInYesterday(sinaDate){
                // 昨天
                // 显示的格式为 昨天 HH:mm 例如 昨天 14:14
                // 设置格式
                df.dateFormat = "昨天 HH:mm"
                return df.string(from: sinaDate)
            }else {
                // 其他
                // 显示的格式为 MM-dd HH:mm 例如 02-02 02:02
                // 设置格式
                df.dateFormat = "MM-dd HH:mm"
                return df.string(from: sinaDate)
            }
            
        }else {
            // 不是今年
            // 显示的格式为 yyyy-MM-dd HH:mm  例如 2015-12-12 12:12
            // 指定格式
            df.dateFormat = "yyyy-MM-dd HH:mm"
            print(df.string(from: sinaDate))
            return df.string(from: sinaDate)
        }
        
    }
    
    // 判断新浪微博的日期是否是今年
    /*
     - 20170102 微博时间
     - 20170207 今年
     */
    func sinaDateisThisYear(sinaDate: Date) -> Bool{
        // 获取当前的日期
        let currentDate = Date()
        // 时间格式化
        let df = DateFormatter()
        // 指定格式
        df.dateFormat = "yyyy"
        // 通过当前的日期得到日期年的字符串
        let currentStr = df.string(from: currentDate)
        // 获取新浪微博的日期年的字符串
        let sinaStr = df.string(from: sinaDate)
        return currentStr == sinaStr
    }
}

